import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import com.alibaba.fastjson.JSON;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class XModel {
    // 获取地址 https://console.xfyun.cn/services/cbm
    public static String APIPassword = "MZgLOGwIPGQRwzWQkSop:hBQOCxDcETmZzMMRhIzt";
    // 核心优化：保存历史对话记录（全局静态，跨轮次复用）
    private static JSONArray messagesHistory = new JSONArray();

    public static void main(String[] args) {
        String userId = "10284711用户";
        Scanner scanner = new Scanner(System.in); // 用于接收用户多轮输入

        try {
            String url = "https://spark-api-open.xf-yun.com/v2/chat/completions";

            // 初始化第一轮对话（可选：保留原有默认问题，也可让用户手动输入）
            System.out.println("请输入您的问题（输入 exit 退出对话）：");
            System.out.print("小火:");
            String userInput = scanner.nextLine();

            // 多轮对话循环：直到用户输入 exit 退出
            while (!"exit".equalsIgnoreCase(userInput)) {
                // 1. 构建当前轮次的用户消息，添加到历史记录
                JSONObject userMessage = new JSONObject();
                userMessage.put("role", "user");
                userMessage.put("content", userInput);
                messagesHistory.put(userMessage); // 关键：历史记录追加用户消息

                // 2. 构建请求参数（复用历史对话记录）
                JSONObject jsonObject = new JSONObject();
                jsonObject.put("user", userId);
                jsonObject.put("model", "x1");
                jsonObject.put("messages", messagesHistory); // 传入全部历史对话
                jsonObject.put("stream", true);
                jsonObject.put("max_tokens", 4096);
                jsonObject.put("temperature", 0.5); // 数值类型，符合API规范

                // 3. 配置HTTP请求（保持原有逻辑，仅优化编码）
                String authorization = "Bearer " + APIPassword; // 鉴权空格已修复
                URL obj = new URL(url);
                HttpURLConnection con = (HttpURLConnection) obj.openConnection();
                con.setRequestMethod("POST");
                con.setRequestProperty("Content-Type", "application/json; charset=utf-8");
                con.setRequestProperty("Authorization", authorization);
                con.setDoOutput(true);

                // 4. 发送请求体（UTF-8编码，避免中文乱码）
                OutputStream os = con.getOutputStream();
                os.write(jsonObject.toString().getBytes("UTF-8"));
                os.flush();
                os.close();

                // 5. 处理响应（流式输出+保存助手回复到历史记录）
                int responseCode = con.getResponseCode();
                if (responseCode != 200) {
                    System.err.println("请求失败，状态码：" + responseCode);
                    // 清除当前轮次的用户消息（避免历史记录污染）
                    messagesHistory.remove(messagesHistory.size() - 1);
                    userInput = scanner.nextLine();
                    continue;
                }

                BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
                String inputLine;
                StringBuilder assistantContent = new StringBuilder(); // 拼接助手完整回复


                while ((inputLine = in.readLine()) != null) {
                    String line = inputLine.trim();
                    if (line.isEmpty()) continue;
                    if (line.contains("[DONE]")) break;

                    // 处理data前缀，解析JSON
                    String jsonStr = line.startsWith("data:") ? line.substring("data:".length()).trim() : line;
                    if (jsonStr.isEmpty()) continue;

                    try {
                        Object parse = JSON.parse(jsonStr);
                        if (parse instanceof Map) {
                            Map<?, ?> map = (Map<?, ?>) parse;
                            List<?> choices = (List<?>) map.get("choices");
                            if (choices != null && !choices.isEmpty()) {
                                Map<?, ?> choiceMap = (Map<?, ?>) choices.get(0);
                                Map<?, ?> delta = (Map<?, ?>) choiceMap.get("delta");
                                if (delta != null && delta.containsKey("content")) {
                                    String content = (String) delta.get("content");
                                    System.out.print(content);
                                    assistantContent.append(content); // 拼接完整回复
                                }
                            }
                        }
                    } catch (Exception e) {
                        System.err.println("\n解析单条响应失败：" + jsonStr);
                    }
                }
                in.close();
                System.out.println(); // 换行收尾

                // 6. 关键优化：保存助手回复到历史记录（用于下轮上下文）
                if (assistantContent.length() > 0) {
                    JSONObject assistantMessage = new JSONObject();
                    assistantMessage.put("role", "assistant");
                    assistantMessage.put("content", assistantContent.toString());
                    messagesHistory.put(assistantMessage); // 追加助手消息到历史
                }

                // 7. 等待用户下一轮输入
                System.out.println("\n请输入您的问题（输入 exit 退出对话）：");
                System.out.print("小火:");
                userInput = scanner.nextLine();
            }

            scanner.close();
            System.out.println("对话结束！");

        } catch (Exception e) {
            System.err.println("对话异常：");
            e.printStackTrace();
        }
    }
}